import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'

// 1.创建一个新的axios实例，实例中配置基地址和timeout
const service = axios.create({
  // baseURL: '/api', // 基地址要区分测试，正式环境
  baseURL: process.env.VUE_APP_BASE_API, // 目的，不同的环境，请求不一样的基地址
  timeout: 260000
})

// 2. 配置请求拦截器 有两个回调函数 成功1（接收成功的信息并return），失败2（接收错误信息并return这个错误信息）
service.interceptors.request.use((config) => {
  // 请求拦截器主要是用于接收token的，所以，先判断token是否存在,存在要放在请求的请求头中
  if (store.getters.token) {
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
}, (error) => {
  return Promise.reject(error)
})

// 3. 配置响应拦截器  两个回调函数
service.interceptors.response.use((response) => {
  // response接收信息默认包裹一层data，用解构赋值解出来
  if (response.data instanceof Blob) {
    return response.data // 返回文件流
  }
  const { data, message, success } = response.data
  // success有true和false两种状态
  if (success) {
    return data // 成功了要返回data数据去使用
  } else {
    // 失败了要返回错误信息
    // 但这里没有错误信息，所以我们自己new一个出来，里面放返回的message即可
    Message({ type: 'error', message })
    return Promise.reject(new Error(message))
  }
}, async(error) => {
  // 这里要返回失败提示信息
  // debugger // 调试使用，若tpken失效，进入debugger，控制台源代码中，此处标红
  if (error.response.status === 401) {
    // token失效/超时，要删除用户信息，token，退出登录,跳转到登录页
    Message({ type: 'warning', message: 'token超时了' })
    await store.dispatch('user/logout')
    router.push('/login')
    return Promise.reject(error)
  }
  // 用饿了么自带的,需要自行配置提示信息
  Message({ type: 'error', message: error.message })
  return Promise.reject(error) // 接收错误信息并标记promise的状态为失败
})

export default service
